home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 April: Mac OS SDK / Dev.CD Apr 96 SDK / Dev.CD Apr 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc / Sample Code / CALib & You… / Source / CALib / Implementation / ProxyPart / CAProxyPartExt.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1995-12-07  |  9.5 KB  |  426 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        CAProxyPartExt.cpp
  3.  
  4.     Contains:    ProxyPart methods for the part extension API. CAProxyPart is 
  5.                 a special instance of a root/container part for interface with
  6.                 a "traditional" app via CALib.
  7.  
  8.     Written by:    Steve Foley 
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <2>    11/18/95    RB        Major strip down.  Removed EXTN_Update(),
  13.                                      EXTN_GetLastEventInfo()
  14.  
  15.          <1>     6/15-6/30    RB        Major rewrite.  
  16.  
  17.         ------------------------------------------------------------------------------
  18.  
  19.          <9>     5/15/95    RB        Adding EXTN_InstallCAFrameShapeHandler,
  20.                                      EXTN_InstallCAFrameAddedHandler,
  21.                                      and EXTN_InstallCAEventInEmbeddedHandler
  22.          <8>     5/08/95    SJF        Fallout from checkin screwup
  23.          <7>     5/06/95    SJF        Cleanup Drag & Drop
  24.          <4>      5/3/95    SJF        Put code in ReleaseExtension
  25.          <3>     4/23/95    RB        Adding EXTN_InstallFocusHandlers()
  26.          <2>     4/01/95    RB        Adding EXTN_InstallWindowActivateHandler()
  27.          <1>     3/15/95    SJF        first checked in
  28.          <0>      3/9/94    SJF        first split out from CAProxyPartStubs.cpp, 
  29.                                      Added methods to support extension
  30.          
  31.     To Do:
  32. */
  33.  
  34. #ifndef _EXCEPT_
  35. #include <Except.h>
  36. #endif
  37.  
  38. #ifndef _CAPROXYPART_
  39. #include "CAProxyPart.h"
  40. #endif
  41.  
  42. #ifndef _CAPROXYPARTDEF_
  43. #include "CAProxyPartDef.h"
  44. #endif
  45.  
  46. #ifndef _CAPROXYDEBUG_
  47. #include "CAProxyDebug.h"
  48. #endif
  49.  
  50. #ifndef SOM_ODWindow_xh
  51. #include <Window.xh>
  52. #endif
  53.  
  54. #ifndef _ISOSTR_
  55. #include <ISOStr.h>
  56. #endif
  57.  
  58. #ifndef SOM_ODDraft_xh
  59. #include <Draft.xh>
  60. #endif
  61.  
  62. #ifndef _ODUTILS_
  63. #include <ODUtils.h>
  64. #endif
  65.  
  66. #ifndef _STORUTIL_
  67. #include <StorUtil.h>
  68. #endif
  69.  
  70. #ifndef _PLFMDEF_
  71. #include <PlfmDef.h>
  72. #endif
  73.  
  74. #ifndef SOM_ODFrFaItr_xh
  75. #include <FrFaItr.xh>
  76. #endif
  77.  
  78. #ifndef _ORDCOLL_
  79. #include <OrdColl.h>
  80. #endif
  81.  
  82. #ifndef SOM_ODFacet_xh
  83. #include <Facet.xh>
  84. #endif
  85.  
  86. #ifndef SOM_ODFrame_xh
  87. #include <Frame.xh>
  88. #endif
  89.  
  90. #ifndef SOM_ODFacetItr_xh
  91. #include <FacetItr.xh>
  92. #endif
  93.  
  94. #ifndef SOM_Module_OpenDoc_StdProps_defined
  95. #include <StdProps.xh>
  96. #endif
  97.  
  98.  
  99. #ifdef USE_CA_SEGMENTS
  100. #pragma segment CAProxyPart
  101. #endif
  102.  
  103.  
  104. //-------------------------------------------------------------------------
  105. // ProxyPart extension interface
  106. //-------------------------------------------------------------------------
  107.  
  108.  
  109.  
  110. void CAProxyPart::ReleaseExtension(Environment* ev, ODExtension* extension)
  111. {
  112.  
  113.     //if (extension->GetRefCount(ev) != 0) DebugStr ("\pExtension refcount problem");
  114.     //ODDeleteObject (extension);
  115.     //fProxyExt = kODNULL;
  116.     
  117. }
  118.  
  119.  
  120.  
  121. ODExtension* CAProxyPart::AcquireExtension(Environment* ev, ODType extensionName)
  122. {
  123.     ODExtension*    pTheExt = kODNULL;
  124.  
  125.     // If we are called with an extension type we don't support,
  126.     // we should be returning an error here.
  127.  
  128.     if (!ODISOStrCompare((ODISOStr)extensionName, kCAProxyPartExtension))
  129.     {
  130.         if (fProxyExt) fProxyExt->Acquire(ev);
  131.         else
  132.         {
  133.             fProxyExt = new CAProxyExtension;
  134.             fProxyExt->InitProxyExtension( ev, fSelf, this );
  135.         }
  136.         
  137.         pTheExt = (ODExtension*)fProxyExt;
  138.  
  139.     }
  140.     else
  141.     {
  142.         ev->_major = kODErrUnsupportedExtension;
  143.         pTheExt = kODNULL;
  144.     }
  145.     return pTheExt;
  146. }
  147.  
  148.  
  149. //    Drag & Drop callback registry for CAProxyPart <==> CALib
  150.  
  151. ODBoolean CAProxyPart::HasExtension(Environment* ev, ODType extensionName)
  152. {
  153.  
  154. ODUnused(ev);
  155.     // ODISOStrCompare returns zero if the strings match...
  156.     if (!ODISOStrCompare((ODISOStr)extensionName, kCAProxyPartExtension))
  157.         return kODTrue;
  158.     else
  159.  
  160.     return kODFalse;
  161. }
  162.  
  163.  
  164. OSErr         CAProxyPart::EXTN_SetDragTrackingHandler( Environment* ev,
  165.                                 DragTrackingHandler trackingHandler,
  166.                                 void*    handlerRefCon)
  167. {
  168. //    Installs a TrackingHandler for OpenDoc
  169. //
  170. //    Exceptions signalled:
  171. //        kCAErrExistingHandler
  172.  
  173.     OSErr    theErr = kODNoError;
  174.         
  175.     if (fCADnDTrackHnd)
  176.         theErr = kCAErrExistingHandler;
  177.     else
  178.     {
  179.         fCADnDTrackHnd = trackingHandler;
  180.         fTrackRefCon = handlerRefCon;
  181.     }
  182. ODUnused( ev );
  183.  
  184.     return theErr;
  185. }
  186.  
  187.  
  188.  
  189.  
  190. OSErr         CAProxyPart::EXTN_SetDragReceiveHandler( Environment* ev,
  191.                                 DragReceiveHandler trackingHandler,
  192.                                 void*    handlerRefCon)
  193. {
  194. //    Installs a Receive  Handler
  195. //
  196. //    Exceptions signalled:
  197. //        kCAErrExisting Handler
  198.  
  199.     OSErr    theErr = kODNoError;
  200.  
  201.     if (fCADnDReceiveHnd)
  202.         theErr = kCAErrExistingHandler;
  203.     else
  204.     {
  205.         fCADnDReceiveHnd = trackingHandler;
  206.         fReceiveRefCon = handlerRefCon;
  207.     }
  208. ODUnused( ev );
  209.  
  210.     return theErr;
  211. }
  212.  
  213.  
  214.  
  215. //--------------------------------------------------------------------
  216.  
  217. void         CAProxyPart::EXTN_InstallCAWindowActivateHandler( Environment* ev,
  218.                                 CAWindowActivateHandlerUPP theHandler)
  219. {
  220. ODUnused( ev );
  221.  
  222.     fCAWindowActivateHandler = theHandler;
  223. }
  224.  
  225. //--------------------------------------------------------------------
  226. void         CAProxyPart::EXTN_InstallCAFocusHandlers( Environment* ev,
  227.                                     CAFocusAcquiredProcUPP aquiredHandler,
  228.                                      CAFocusLostProcUPP        lostHandler,
  229.                                      CADocumentRef        docRef)
  230. {
  231. ODUnused( ev );
  232.  
  233.     fCAFocusAquiredHandler = aquiredHandler;
  234.     fCAFocusLostHandler = lostHandler;
  235.     fCADocumentRef = docRef;
  236.  
  237. }
  238.  
  239. //--------------------------------------------------------------------
  240. void         CAProxyPart::EXTN_InstallCAAdjustBorderHandler( Environment* ev,
  241.                                     CAProxyHookAdjustBorder theHook,
  242.                                     CAAdjustBorderProc theHandler)
  243. {
  244. ODUnused( ev );
  245.  
  246.     if ((theHook == kODNULL) || (theHandler == kODNULL))
  247.     {
  248.         DebugStr ("\pEXTN_InstallCAAdjustBorderHandler - NULL handler routines!");
  249.     }
  250.     
  251.     fCAAdjustBorderHook = theHook;
  252.     fCAAdjustBorderHandler = theHandler;
  253.  
  254. }
  255.  
  256. //--------------------------------------------------------------------
  257. void         CAProxyPart::EXTN_AddFrame(    Environment* ev,
  258.                                             ODFrame* theFrame)
  259. {
  260.  
  261.     CFrameInfo*    frameInfo;
  262.     
  263.     frameInfo = new CFrameInfo (ev, theFrame->GetID(ev), theFrame->GetStorageUnit(ev)->GetDraft(ev));
  264.     frameInfo->Internalize();
  265.     frameInfo->Externalize(fSelf->GetStorageUnit(ev));
  266.     fEmbeddedFrames->AddLast(frameInfo);
  267.     this->UTIL_SetDirty (ev);
  268.  
  269. }
  270.  
  271.  
  272.  
  273.  
  274. //--------------------------------------------------------------------
  275. void         CAProxyPart::EXTN_RemoveFrame(        Environment* ev,
  276.                                                 ODFrame* theFrame)
  277. {
  278.  
  279.     ODFrame*                    rootFrame            = kODNULL;
  280.     CFrameInfo*                    frameInfo;
  281.     ODFacetIterator*            facets;
  282.     ODFacet*                    containingFacet;
  283.     ODFacet*                    facet;
  284.     ODFacet*                    childFacet;
  285.     ODStorageUnit*                storageUnit = fSelf->GetStorageUnit(ev);
  286.     OrderedCollection*            facetColl;
  287.     OrderedCollectionIterator*    iter;
  288.     
  289.     frameInfo = this->UTIL_FindFrameInfoForFrame (ev, theFrame);
  290.     rootFrame = fDisplayFrame->GetFrame();
  291.     
  292.     SOM_TRY
  293.     
  294.     
  295.         facetColl = new OrderedCollection;
  296.         
  297.         ODFrameFacetIterator* rootFacets = rootFrame->CreateFacetIterator(ev);
  298.         for (containingFacet = rootFacets->First(ev);
  299.                 rootFacets->IsNotComplete(ev);
  300.                 containingFacet = rootFacets->Next(ev))
  301.         {
  302.  
  303.             facets = containingFacet->CreateFacetIterator(ev, kODChildrenOnly, kODFrontToBack);
  304.             for (facet = facets->First(ev);
  305.                     facets->IsNotComplete(ev);
  306.                     facet = facets->Next(ev))
  307.             {
  308.                 if ( facet->GetFrame(ev) == theFrame )
  309.                     facetColl->AddLast(facet);
  310.             }
  311.             ODDeleteObject (facets);
  312.  
  313.             iter = facetColl->CreateIterator();
  314.             for (childFacet = (ODFacet*) iter->First(); iter->IsNotComplete();
  315.                     childFacet = (ODFacet*) iter->Next())
  316.             {
  317.                 containingFacet = childFacet->GetContainingFacet(ev);
  318.                 containingFacet->RemoveFacet (ev, childFacet);
  319.                 ODDeleteObject(childFacet);
  320.  
  321.             }
  322.         
  323.             ODDeleteObject (iter);
  324.             ODDeleteObject (facetColl);
  325.             
  326.         }
  327.     
  328.         if (frameInfo)
  329.         {
  330.         
  331.             ODSize                        streamSize;
  332.             ODStorageUnitRef            suRef, tempRef;
  333.             ODSize                        offset;
  334.  
  335.             // Remove the frame from our internal list
  336.             fEmbeddedFrames->Remove(frameInfo);
  337.             
  338.             // Remove the SU ref from the kODPropEmebeddedFrames property
  339.             
  340.             ODSUExistsThenFocus (ev, storageUnit, kCAPropEmbeddedFrames, kODStrongStorageUnitRefs);
  341.             storageUnit->GetStrongStorageUnitRef(ev, frameInfo->GetID(), suRef);
  342.             streamSize = storageUnit->GetSize(ev);
  343.             
  344.             TRACE (3, "Removing frame %d, ref %x, streamsize = %d", frameInfo->GetID(),
  345.                     suRef, streamSize);
  346.  
  347.             storageUnit->RemoveStorageUnitRef (ev, suRef);
  348.  
  349.             // Now remove the suRef from the value stream
  350.             
  351.             storageUnit->SetOffset (ev, 0);
  352.             
  353.             while (offset < streamSize)
  354.             {
  355.                 offset = storageUnit->GetOffset (ev);
  356.                 StorageUnitGetValue(storageUnit, ev, kODStorageUnitRefLen, tempRef);
  357.                 
  358.                 if (*tempRef == *suRef)
  359.                 {
  360.                     TRACE (3, "Deleteing the ref from the stream at offset %d", offset);
  361.                     storageUnit->SetOffset (ev, offset);
  362.                     storageUnit->DeleteValue (ev, kODStorageUnitRefLen);
  363.                     break;
  364.                 }
  365.                 
  366.                 offset = storageUnit->GetOffset (ev);
  367.             }
  368.             
  369.             streamSize = storageUnit->GetSize(ev);
  370.             TRACE (3, "After Remove streamsize = %d", streamSize);
  371.             
  372.             // this releases theFrame
  373.             ODDeleteObject (frameInfo);
  374.             
  375.             this->UTIL_SetDirty (ev);
  376.     
  377.         }
  378.     
  379.     SOM_ENDTRY
  380.     
  381. }
  382. //--------------------------------------------------------------------
  383. void         CAProxyPart::EXTN_InstallCAFrameShapeRequestHandler( Environment* ev,
  384.                                     CAProxyHookFrameShapeRequest theHook,
  385.                                     CAFrameShapeRequestHandler theHandler)
  386. {
  387. ODUnused( ev );
  388.  
  389.     if ((theHook == kODNULL) || (theHandler == kODNULL))
  390.     {
  391.         DebugStr ("\pEXTN_InstallCAFrameShapeRequestHandler - NULL handler routines!");
  392.     }
  393.     
  394.     fCAFrameShapeRequestHook = theHook;
  395.     fCAFrameShapeRequestHandler = theHandler;
  396.  
  397. }
  398.  
  399. //--------------------------------------------------------------------
  400. void         CAProxyPart::EXTN_InstallCACanvasUpdatedHandler( Environment* ev,
  401.                                     CACanvasUpdatedProcUPP         theHandler)
  402. {
  403. ODUnused( ev );
  404.  
  405.     if (theHandler == kODNULL)
  406.     {
  407.         DebugStr ("\pEXTN_InstallCACanvasUpdatedHandler - NULL handler routines!");
  408.     }
  409.     
  410.     fCACanvasUpdatedHandler = theHandler;
  411.  
  412. }
  413.  
  414. //--------------------------------------------------------------------
  415. void         CAProxyPart::EXTN_GetLastEventInfo( Environment* ev,
  416.                                                 ODEventInfo* eventInfo)
  417. {
  418. ODUnused( ev );
  419.  
  420.     *eventInfo = this->fLastEventInfo;
  421.     this->fLastEventInfo.embeddedFrame = kODNULL;
  422.     this->fLastEventInfo.embeddedFacet = kODNULL;
  423.  
  424. }
  425.  
  426.